describe('书籍发布和编辑测试', () => {
  // 测试用户信息
  const TEST_USER = {
    username: 'user',
    password: '111111'
  }

  // 测试书籍信息
  const TEST_BOOK = {
    title: '测试书籍_' + Date.now(),
    author: '测试作者',
    tags: ['小说', '科幻'],
    thoughts: '这是一本非常好的书，推荐阅读。这是测试发布的内容。',
    reading_url: 'https://example.com/book'
  }

  beforeEach(() => {
    // 清除 cookies
    cy.clearCookies()
    
    // 拦截API请求
    cy.intercept('GET', '/api/books/me/books').as('getMyBooks')
    cy.intercept('POST', '/api/books').as('createBook')
    cy.intercept('PUT', '/api/books/*').as('updateBook')
    cy.intercept('DELETE', '/api/books/admin/*').as('deleteBook')
    
    // 访问首页
    cy.visit('/')
    
    // 执行登录
    cy.login(TEST_USER.username, TEST_USER.password)

    // 等待页面加载完成
    cy.get('.user-info', { timeout: 10000 }).should('be.visible')
  })

  it('流程1：发布新书籍测试', () => {
    // 直接访问分享书籍页面
    cy.visit('/user/post')
    
    // 等待表单加载
    cy.get('.book-form', { timeout: 10000 }).should('be.visible')

    // 填写表单
    cy.get('input[placeholder="请输入书籍标题"]').type(TEST_BOOK.title)
    cy.get('input[placeholder="请输入作者姓名"]').type(TEST_BOOK.author)
    
    // 选择标签
    cy.get('.el-select').click()
    TEST_BOOK.tags.forEach(tag => {
      cy.contains('.el-select-dropdown__item', tag).click()
    })
    cy.get('body').click() // 关闭下拉框

    // 上传图片
    cy.get('.cover-uploader input[type="file"]').attachFile('images/test.png')

    // 等待图片上传和预览
    cy.get('.image-list', { timeout: 15000 }).within(() => {
      cy.get('.image-item')
        .should('be.visible')
        .find('img.cover')
        .should('have.attr', 'src')
        .and('not.be.empty')
    })

    // 输入阅读链接
    cy.get('input[placeholder*="阅读链接"]').type(TEST_BOOK.reading_url)

    // 输入读后感
    cy.get('textarea[placeholder*="读后感"]').type(TEST_BOOK.thoughts)

    // 提交表单
    cy.contains('button', '发布').click()

    // 等待创建请求完成
    cy.wait('@createBook', { timeout: 15000 })

    // 访问已发布页面并确保页面加载完成
    cy.visit('/user/my-posts')
    cy.url().should('include', '/user/my-posts')
    
    // 等待数据加载
    cy.wait('@getMyBooks', { timeout: 15000 })
    
    // 验证新发布的书籍存在
    cy.contains(TEST_BOOK.title).should('be.visible')
  })

  it('流程2：编辑已发布书籍测试', () => {
    // 直接访问已发布页面并确保页面加载完成
    cy.visit('/user/my-posts')
    cy.url().should('include', '/user/my-posts')
    
    // 等待数据加载
    cy.wait('@getMyBooks')

    // 移除新标签页的目标属性，使其在当前页面打开
    cy.window().then((win) => {
      cy.stub(win, 'open').as('windowOpen')
    })

    // 找到之前发布的书籍并点击编辑按钮
    cy.contains('tr', TEST_BOOK.title).within(() => {
      cy.get('.operation-cell')
        .find('.el-button')
        .first()  // 编辑按钮是第一个
        .click()
    })

    // 等待新窗口打开并获取URL
    cy.get('@windowOpen').then((stub) => {
      expect(stub).to.be.called
      const editUrl = stub.firstCall.args[0]
      // 直接访问编辑页面
      cy.visit(editUrl)
    })

    // 等待编辑表单加载
    cy.get('.book-form', { timeout: 10000 }).should('be.visible')

    // 修改标题
    const newTitle = TEST_BOOK.title + '_已编辑'
    cy.get('input[placeholder="请输入书籍标题"]')
      .should('have.value', TEST_BOOK.title)  // 验证原有值
      .clear()
      .type(newTitle)

    // 修改作者
    const newAuthor = TEST_BOOK.author + '_已编辑'
    cy.get('input[placeholder="请输入作者姓名"]')
      .should('have.value', TEST_BOOK.author)  // 验证原有值
      .clear()
      .type(newAuthor)

    // 修改读后感
    const newThoughts = TEST_BOOK.thoughts + '_已编辑'
    cy.get('textarea[placeholder*="读后感"]')
      .should('have.value', TEST_BOOK.thoughts)  // 验证原有值
      .clear()
      .type(newThoughts)

    // 修改阅读链接
    const newReadingUrl = TEST_BOOK.reading_url.replace('example.com', 'example.org')
    cy.get('input[placeholder*="阅读链接"]')
      .should('have.value', TEST_BOOK.reading_url)  // 验证原有值
      .clear()
      .type(newReadingUrl)

    // 保存编辑
    cy.contains('button', '保存').click()

    // 等待更新请求完成
    cy.wait('@updateBook')

    // 访问已发布页面并等待数据加载
    cy.visit('/user/my-posts')
    cy.wait('@getMyBooks')

    // 验证修改后的内容存在
    cy.contains(newTitle).should('be.visible')
    cy.contains('tr', newTitle).within(() => {
      cy.contains(newAuthor).should('be.visible')
    })
  })

  it('流程3：下架和删除书籍测试', () => {
    // 直接访问已发布页面并确保页面加载完成
    cy.visit('/user/my-posts')
    cy.url().should('include', '/user/my-posts')
    
    // 等待数据加载
    cy.wait('@getMyBooks')

    // 找到测试书籍并下架
    cy.contains('tr', TEST_BOOK.title + '_已编辑').within(() => {
      // 下架书籍（查找警告类型的按钮）
      cy.get('.operation-cell')
        .find('.el-button--warning')
        .click()
    })

    // 验证状态变更为已下架
    cy.contains('tr', TEST_BOOK.title + '_已编辑')
      .find('.el-tag')
      .should('contain', '已下架')

    // 重新上架书籍
    cy.contains('tr', TEST_BOOK.title + '_已编辑').within(() => {
      // 上架书籍（查找成功类型的按钮）
      cy.get('.operation-cell')
        .find('.el-button--success')
        .click()
    })

    // 验证状态变更为已发布
    cy.contains('tr', TEST_BOOK.title + '_已编辑')
      .find('.el-tag')
      .should('contain', '已发布')

    // 再次下架书籍
    cy.contains('tr', TEST_BOOK.title + '_已编辑').within(() => {
      cy.get('.operation-cell')
        .find('.el-button--warning')
        .click()
    })

    // 验证状态再次变更为已下架
    cy.contains('tr', TEST_BOOK.title + '_已编辑')
      .find('.el-tag')
      .should('contain', '已下架')

    // 删除书籍
    cy.contains('tr', TEST_BOOK.title + '_已编辑').within(() => {
      cy.get('.operation-cell')
        .find('.el-button--danger')
        .click()
    })

    // 等待列表刷新
    cy.wait('@getMyBooks')

    // 验证书籍已从列表中移除
    cy.contains(TEST_BOOK.title + '_已编辑').should('not.exist')
  })
}) 